/*
 * 文 件 名:  ToolTag.java
 * 版    权:   深圳埃思欧纳信息咨询有限公司版权所有. YYYY-YYYY,  All rights reserved
 * 描    述:   <描述>
 * 修 改 人:  honny.huang
 * 修改时间: 2010-11-1
 * 跟踪单号:  <跟踪单号>
 * 修改单号:  <修改单号>
 * 修改内容:  <修改内容>
 */
package com.common.tag;

import java.io.UnsupportedEncodingException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.common.utils.StringUtil;

/**
 * <一句话功能简述> <功能详细描述>
 *
 * @author honny.huang
 * @version [版本号, 2010-11-1]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */

public class ToolTag
{
	/**    
     * 获取字符串长度，中文字符算2个字节，中文格式的标点符号算1个字节.
     * <功能详细描述>
     * @param str
     * @return [参数说明]
     * 
     * @return int [返回类型说明]
     * @exception throws [违例类型] [违例说明]
     * @see [类、类#方法、类#成员]
     */
    private static int getStrLen(String str)
    {
        int count=0;
        String regEx = "[\\u4e00-\\u9fa5]";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        while(m.find())count++;
        return str.length()+count;
     }
	
	/***
	 * 限制字符串长度，中文字符算2个字节，去掉截一半的汉字
	 * @param param 原字符串
	 * @param num 限制的长度
	 * @return
	 */
	public static String limitStrLengthTag(String param,int num)
    {
		if (null == param || "".equals(param))
		{
			return "";
		}
		int strlen = getStrLen(param);
		if (strlen <= num)
		{
			return param;
		}
		char[] b = param.toCharArray();
		String regEx = "[\\u4e00-\\u9fa5]";
        Pattern p = Pattern.compile(regEx);
        StringBuffer sb = new StringBuffer("");
        int count = 0;
		for (int i = 0;i < num;i++)
		{
			Matcher m = p.matcher(b[count]+"");
			
			if(m.find())
			{
				i++;
				if (i >= num)
				{
					continue;
				}
			}
			sb.append(b[count]);
			count++;
		}
        return sb.toString() + "...";
    }
	
	/**
	 * 截取字符串，中文字符和中文格式的标点符号都算2个字节，保留截一半的汉字
	 * <功能详细描述>
	 * @param s
	 * @param length
	 * @return
	 * 
	 * @return String [返回类型说明]
	 * @exception throws [违例类型] [违例说明]
	 * @see [类、类#方法、类#成员]
	 */
	public static String splitUnicodeString(String s, int length)
	{   
	    try
	    {
            byte[] bytes = s.getBytes("Unicode");
            System.out.println(bytes);
            int n = 0; // 表示当前的字节数   
            int i = 2; // 要截取的字节数，从第3个字节开始   
            for (; i < bytes.length && n < length; i++){   
                // 奇数位置，如3、5、7等，为UCS2编码中两个字节的第二个字节   
                if (i % 2 == 1){   
                    n++; // 在UCS2第二个字节时n加1   
                }   
                else{   
                    // 当UCS2编码的第一个字节不等于0时，该UCS2字符为汉字，一个汉字算两个字节   
                    if (bytes[i] != 0){   
                        n++;   
                    }   
                }   
                   
            }   
            // 如果i为奇数时，处理成偶数   
            /*if (i % 2 == 1){  
                // 该UCS2字符是汉字时，去掉这个截一半的汉字  
                if (bytes[i - 1] != 0)  
                    i = i - 1;  
                // 该UCS2字符是字母或数字，则保留该字符  
                else  
                    i = i + 1;  
            }*/  
            //将截一半的汉字要保留   
            if (i % 2 == 1){   
             i = i + 1;   
            }   
            return new String(bytes, 0, i, "Unicode");
        }
        catch (UnsupportedEncodingException e)
        {
            return s.substring(0,length);
        }   
    } 
	
	/**
	 * 根据编码格式获取字符串长度
	 * <功能详细描述>
	 * @param str
	 * @return
	 * 
	 * @return int [返回类型说明]
	 * @exception throws [违例类型] [违例说明]
	 * @see [类、类#方法、类#成员]
	 */
	 public static int getStrLenByEncoding(String paramString, String encoding) 
	 {
		  int length = 0;
	      try 
	      {
	    	  if (StringUtil.isNotNullAndEmpty(paramString)) 
	    	  {
	    		  if (StringUtil.isNotNullAndEmpty(encoding))
	    		  {
	    			  // UTF-8格式时一个中文字符和中文标点符号占3个字节;
		    		  // GBK和GB2312格式时一个中文字符和中文标点符号占2个字节
		    		  if (encoding.equalsIgnoreCase("UTF-8") || encoding.equalsIgnoreCase("GBK") || encoding.equalsIgnoreCase("GB2312"))
		    		  {
		    			  length = paramString.getBytes(encoding).length; 
					  }
				  }
	    		  else {
	    			  // 直接调用string的length方法则一个中文字符和中文标点符号占1个字节
	    			  length = paramString.length(); // 12
				  }
			   }
		   } catch (UnsupportedEncodingException e) 
		   {
			   e.printStackTrace();
		   }
		  return length;
	 }
	 
	public static void main(String[] args) throws Exception
	{
		String a = "我爱您，shotfu打算";
		System.out.print(getStrLen(a)); // 17
		getStrLenByEncoding(a,"");
		System.err.print(getStrLenByEncoding(a,"utf-8"));
		System.out.println(limitStrLengthTag(a,13)); // 我爱您，shotfu...
		System.out.println(splitUnicodeString(a,13)); // 我爱您，shotf
	}

}
